package com.clei.leetcode;

import com.clei.utils.PrintUtil;

/**
 * 爱生气的书店老板
 * 今天，书店老板有一家店打算试营业 customers.length 分钟。每分钟都有一些顾客（customers[i]）会进入书店，所有这些顾客都会在那一分钟结束后离开。
 * <p>
 * 在某些时候，书店老板会生气。 如果书店老板在第 i 分钟生气，那么 grumpy[i] = 1，否则 grumpy[i] = 0。 当书店老板生气时，那一分钟的顾客就会不满意，不生气则他们是满意的。
 * <p>
 * 书店老板知道一个秘密技巧，能抑制自己的情绪，可以让自己连续 X 分钟不生气，但却只能使用一次。
 * <p>
 * 请你返回这一天营业下来，最多有多少客户能够感到满意的数量。
 * <p>
 * <p>
 * 示例：
 * <p>
 * 输入：customers = [1,0,1,2,1,1,7,5], grumpy = [0,1,0,1,0,1,0,1], X = 3
 * 输出：16
 * 解释：
 * 书店老板在最后 3 分钟保持冷静。
 * 感到满意的最大客户数量 = 1 + 1 + 1 + 1 + 7 + 5 = 16.
 *
 * @author KIyA
 */
public class Algorithm1052 {

    public static void main(String[] args) {
        int[] customers = {1, 0, 1, 2, 1, 1, 7, 5};
        int[] grumpy = {0, 1, 0, 1, 0, 1, 0, 1};
        int x = 3;
        PrintUtil.log(maxSatisfied(customers, grumpy, x));
    }

    private static int maxSatisfied(int[] customers, int[] grumpy, int X) {
        int length = customers.length;
        if (X >= length) {
            int sum = 0;
            for (int i = 0; i < length; i++) {
                sum += customers[i];
            }
            return sum;
        }
        // 最大改变数
        int maxChanged = 0;
        // 满意的顾客数
        int satisfiedCustom = 0;
        // 最开始
        for (int i = 0; i < X; i++) {
            if (1 == grumpy[i]) {
                maxChanged += customers[i];
            } else {
                satisfiedCustom += customers[i];
            }
        }
        int tempChanged = maxChanged;
        for (int i = 1; i < length - X + 1; i++) {
            // if (1 == grumpy[i - 1]);
            tempChanged -= customers[i - 1] * grumpy[i - 1];
            int nextIndex = i + X - 1;
            // if (1 == grumpy[nextIndex])
            tempChanged += customers[nextIndex] * grumpy[nextIndex];
            // if (0 == grumpy[nextIndex])
            satisfiedCustom += customers[nextIndex] * (1 - grumpy[nextIndex]);
            if (tempChanged > maxChanged) {
                maxChanged = tempChanged;
            }
        }

        return satisfiedCustom + maxChanged;
    }

}
